package com.zy.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.zy.bean.bo.flow.LiteFlowChainCreateBo;
import com.zy.bean.po.LiteflowChain;
import com.zy.bean.qo.LiteflowSearchQo;
import com.zy.bean.vo.LiteflowChainVo;
import com.zy.parser.logicflow.LogicFlow;

/**
 * @author hanhuafeng
 * @createDate 2023-05-31 15:58:12
 * @description liteflow编排规则流程表
 */
public interface LiteflowChainService extends IService<LiteflowChain> {
    /**
     * 分页查询liteflow编排规则流程
     *
     * @param qo 查询入参
     * @return 分页结果
     */
    IPage<LiteflowChainVo> selectLiteflowChainByPage(LiteflowSearchQo qo);

    /**
     * 保存流程图
     *
     * @param chartCode        流程图编码
     * @param chartVersionCode 流程图版本编码
     * @param logicFlow        流程图
     * @return 返回编排规则的id
     * @throws JsonProcessingException json转换异常
     */
    String saveFlowChart(String chartCode, String chartVersionCode, LogicFlow logicFlow) throws JsonProcessingException;

    /**
     * 更新流程图节点信息和规则编排信息
     *
     * @param chartCode   流程图编码
     * @param versionCode 版本编码
     * @param logicFlow   流程图
     * @return 返回编排规则的id
     * @throws JsonProcessingException json转换异常
     */
    String updateFlowChart(String chartCode, String versionCode, LogicFlow logicFlow) throws JsonProcessingException;

    /**
     * 保存一份新的liteflow编排规则流程
     *
     * @param liteFlowChainCreateBo liteflow编排规则流程创建入参
     * @return 保存的liteflow编排规则流程
     */
    LiteflowChain saveNewLiteflowChain(LiteFlowChainCreateBo liteFlowChainCreateBo);

    /**
     * 根据流程图编码和版本编码获取流程图
     *
     * @param chartCode   流程图编码
     * @param versionCode 版本编码
     * @return 流程图
     * @throws JsonProcessingException json转换异常¬
     */
    LogicFlow getLogicFlowLinkByCodeAndVersion(String chartCode, String versionCode) throws JsonProcessingException;


    /**
     * 执行流程
     *
     * @param chainName 流程图编码
     * @param param     入参
     * @return 执行结果
     */
    LiteflowResponse execute(String chainName, Object param);

    /**
     * 复制liteflow流程
     *
     * @param chartCode      流程图编码
     * @param oldVersionCode 旧版本编码
     * @param versionCode    新版本编码
     */
    void copyFlowChain(String chartCode, String oldVersionCode, String versionCode);

    /**
     * 根据规则组code执行流程
     *
     * @param chartCode 规则组code
     * @param param     入参(非必须，如果存在，则会覆盖规则组中的初始化入参)
     */
    LiteflowResponse executeByChartCode(String chartCode, Object param);
}
